<?php

/**
 * Subclass for representing a row from the 'jour' table.
 *
 * 
 *
 * @package lib.model
 */ 
class Jour extends BaseJour
{
	
	private  $isSemaineMustBeSaved = true ; //changement de semaine dans le traitement
	
	//surcharge de hydrate pour cr�er un attribut objet de la classe date
	//Inutile, pour test
	/*
	public function hydrate(ResultSet $rs, $startcol = 1) {
		BaseJour::hydrate($rs, $startcol);
			$this->objDate = new clDate($this->getDate());
	}*/
	
	public function setType($type) {
		//si pas de changement, on ne fait rien du tout
		$oldType = $this->getType();
		if ( $oldType == $type )
			return parent::setType($type) ;
		parent::setType($type);
		//si date d�finie, on definit si besoin les p�riodes par defaut
		if($this->getDate()) {
			$this->loadDefaults();
		}
	}
	
	//horaires et dur�es par defaut
	public function loadDefaults() {
		if(! TypeJourPeer::retrieveByPK($this->getType())->isOnlyDuree()) {
			$this->setHeureArrivee($this->getObjDate()->getDate('Y-m-d 08:00:00'));
			$this->setHeureDepart($this->getObjDate()->getDate('Y-m-d 17:00:00'));	
			$this->setDureePause(30);
		} else if (TypeJourPeer::retrieveByPK($this->getType())->isOnlyDuree()) {
			$this->setTotalJournee(TypeJourPeer::retrieveByPK($this->getType())->getDefaultDuree());
		}
	}
	
	//Cette fonction n'est appell�e que lors de la cr�ation de l'instance
	//La date ne change jamais ensuite
	//On peut donc d�finir des valeurs default
	public function setDate($date) {
		BaseJour::setDate($date);
		//instanciation de l'objet clDate
		$this->objDate = new clDate($this->getDate());
		//type de jour par default
		if(in_array($this->getObjDate()->getDayWeekNumber(),array(6,0)))
			$this->setType(TypeJourPeer::getDefautWE()->getId());
		else
			$this->setType(TypeJourPeer::getDefautJO()->getId());
		$this->loadDefaults();
	}
	
	//surcharge de l'heure arriv�e pour mettre � jour le temps de travail
	public function setHeureArrivee($strDateTime) {
		parent::setHeureArrivee($strDateTime);
		if($this->getObjDateDepart())
			$this->setTotalJournee($this->calcTotalJournee()) ;
	}
	
	//surcharge de l'heure d�part pour mettre � jour le temps de travail
	public function setHeureDepart($strDateTime) {
		parent::setHeureDepart($strDateTime);
		if($this->getObjDateArrivee())
			$this->setTotalJournee($this->calcTotalJournee()) ;
	}
	
	//surcharge du temps de pause pour mettre � jour le temps de travail
	public function setDureePause($intDureePause) {
		parent::setDureePause($intDureePause);
		$this->setTotalJournee($this->calcTotalJournee()) ;
	}
	
	//Calcul du temps de travail
	public function calcTotalJournee() {
		$tempsPresence = floor($this->getObjDateDepart()->getDifference($this->getObjDateArrivee())/60);
		$tempsPause = $this->getDureePause() ;
		if($tempsPresence < $tempsPause) 
			return 0 ;
		return  $tempsPresence - $tempsPause ;
	}
	
	//surcharge le changement de validation de la journ�e pour mettre � jour la dur�e de travail dans la semaine
	public function setIsValide($n) {
		parent::setIsValide($n);

    $semaine = SemainePeer::retrieveByPK($this->getSemaineId());
    $semaine->setTotal($this->getCumulSemaine());
    $semaine->save();
	}

	public function setIsValideResponsable($v) {
		parent::setIsValideResponsable($v);

    $semaine = SemainePeer::retrieveByPK($this->getSemaineId());
    $semaine->setTotal($this->getCumulSemaine());
    $semaine->save();
	}
  
  public function getCumulSemaine() {
    $criteria = new Criteria();
		$criteria->add(JourPeer::SEMAINE_ID, $this->getSemaineId());
		$criteria->add(JourPeer::WORKER_ID, $this->getWorkerId());
    
    $total = 0;
    
		foreach(JourPeer::doSelect($criteria) as $jour)
			if(($jour->getIsValide() || $jour->getIsValideResponsable()) && !$jour->getIsDeplact())
				$total += $jour->getTotalJournee();
      
    return $total;
  }
	
	//surchare le save pour mettre � jour la semaine si besoin
//	public function save($con = null) {
//		parent::save($con);
//
//	}
	
	public function getObjDate() {
		if(! isset($this->objDate) || ! $this->objDate )
			$this->objDate = new clDate($this->getDate());
		return $this->objDate ;
	}
	
	public function getObjDateArrivee() {
		if(TypeJourPeer::retrieveByPK($this->getType())->isOnlyDuree())
			return null ;
		if( $this->getHeureArrivee() )
			return new clDate($this->getHeureArrivee());	
	}
	
	public function getObjDateDepart() {
		if(TypeJourPeer::retrieveByPK($this->getType())->isOnlyDuree())
			return null ;
		if( $this->getHeureDepart() )
			return new clDate($this->getHeureDepart());	
	}
	
	public function isValide() {
		return ($this->getIsValide()==1?true:false) ;	
	}
        
        public function isValideResponsable() {
		return ($this->getIsValideResponsable()==1?true:false) ;	
	}

	public function getSemaine(){
	    return SemainePeer::retrieveByPK($this->getSemaineId());
	}
	public function setSemaine(Semaine $s){
	    $this->setSemaineId($s->getId());
	}
}
